package common.util;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import network.protocol.Response;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

/**
 * 基于Fastjson的JSON工具类
 */
public class JsonUtil {

    // 配置Fastjson的序列化特性
    private static final SerializerFeature[] FEATURES = {
            SerializerFeature.WriteMapNullValue, // 输出空值字段
            SerializerFeature.WriteNullListAsEmpty, // 空List输出为[]而不是null
            SerializerFeature.WriteNullStringAsEmpty, // 空String输出为""而不是null
            SerializerFeature.WriteDateUseDateFormat, // 日期格式化
            SerializerFeature.PrettyFormat // 格式化输出，开发阶段可用，生产环境可去掉
    };

    /**
     * 将对象转换为JSON字符串
     * @param obj 要转换的对象
     * @return JSON字符串
     */
    public static String toJson(Object obj) {
        return JSON.toJSONString(obj, FEATURES);
    }

    /**
     * 将对象转换为JSON字符串（简洁版，不包含空值字段）
     * @param obj 要转换的对象
     * @return JSON字符串
     */
    public static String toJsonSimple(Object obj) {
        return JSON.toJSONString(obj);
    }

    /**
     * 将JSON字符串转换为指定类型的对象
     * @param json JSON字符串
     * @param clazz 目标类型Class
     * @param <T> 泛型类型
     * @return 转换后的对象
     */
    public static <T> T fromJson(String json, Class<T> clazz) {
        return JSON.parseObject(json, clazz);
    }

    /**
     * 将JSON字符串转换为List集合
     * @param json JSON字符串
     * @param clazz List中元素的类型Class
     * @param <T> 泛型类型
     * @return 转换后的List集合
     */
    public static <T> List<T> fromJsonArray(String json, Class<T> clazz) {
        return JSON.parseArray(json, clazz);
    }

    /**
     * 将JSON字符串转换为JSONObject（用于动态处理JSON）
     * @param json JSON字符串
     * @return JSONObject对象
     */
    public static JSONObject parseObject(String json) {
        return JSON.parseObject(json);
    }

    /**
     * 向HTTP响应中输出JSON数据
     * @param response HttpServletResponse对象
     * @param data 要输出的数据
     * @throws IOException
     */
    public static void writeJson(HttpServletResponse response, Object data) throws IOException {
        response.setContentType("application/json;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.write(toJson(data));
        out.flush();
    }

    /**
     * 向HTTP响应中输出统一的Result结果
     * @param response HttpServletResponse对象
     * @param result Result对象
     * @throws IOException
     */
    public static void writeResult(HttpServletResponse response, Response<?> result) throws IOException {
        writeJson(response, result);
    }

    /**
     * 向HTTP响应中输出成功的JSON结果（快捷方法）
     * @param response HttpServletResponse对象
     * @param data 数据对象
     * @throws IOException
     */
    public static void writeSuccess(HttpServletResponse response, Object data) throws IOException {
        writeResult(response, Response.success(data));
    }

    /**
     * 向HTTP响应中输出错误的JSON结果（快捷方法）
     * @param response HttpServletResponse对象
     * @param message 错误信息
     * @throws IOException
     */
    public static void writeError(HttpServletResponse response, String message) throws IOException {
        writeResult(response, Response.error(message));
    }

    /**
     * 向HTTP响应中输出错误的JSON结果（带状态码）
     * @param response HttpServletResponse对象
     * @param code 状态码
     * @param message 错误信息
     * @throws IOException
     */
    public static void writeError(HttpServletResponse response, int code, String message) throws IOException {
        writeResult(response, Response.error(code, message));
    }
}
